package com.pj.project.sys_client;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.pj.utils.sg.AjaxError;
import com.pj.utils.so.SoMap;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.util.SaFoxUtil;

/**
 * 工具类：sys_client -- 应用表
 * @author shengzhang 
 *
 */
@Component
public class SysClientUtil {

	
	/** 底层 Mapper 对象 */
	public static SysClientMapper sysClientMapper;
	@Autowired
	private void setSysClientMapper(SysClientMapper sysClientMapper) {
		SysClientUtil.sysClientMapper = sysClientMapper;
	}
	
	/** SSO授权url，缓存使用的key */
	public final static String SSO_ALLOW_URL_KEY = "VAR:SA_SSO_ALLOW_URL_LIST";
	
	/** SSO授权url，缓存使用的有效期时长 */
	public final static long SSO_ALLOW_URL_TTL = 60 * 60 * 24 * 30;
	
	/**
	 * 获取所有SSO允许授权的url 
	 * @return /
	 */
	public static String getAllowUrls() {
		// 先查询缓存里是否已有数据 
		String urls = SaManager.getSaTokenDao().get(SSO_ALLOW_URL_KEY);
		
		// 如果缓存里不存在，则立即添加上 
		if(urls == null) {
			urls = "";
			List<SysClient> clientList = sysClientMapper.getList(SoMap.getSoMap());
			for (SysClient client : clientList) {
//				System.out.println(clientList);
//				System.out.println(client);
				if(client.getStatus() == 1 && SaFoxUtil.isEmpty(client.getAllowUrl()) == false) {
					// 解析url列表，形如 "url,url,url"
					String[] urlArray = client.getAllowUrl().split(",");
					for (String url : urlArray) {
						url = url.trim();
						if(SaFoxUtil.isEmpty(url) == false) {
							urls += url + ",";
						}
					}
				}
			}
			// 去掉最后一位字符逗号 
			if(SaFoxUtil.isEmpty(urls) == false) {
				urls = urls.substring(0, urls.length() - 1);
			}
			// 写入缓存 
			SaManager.getSaTokenDao().set(SSO_ALLOW_URL_KEY, urls, SSO_ALLOW_URL_TTL);
		}
		
		// 返回数据 
		return urls;
	}

	/**
	 * 清除缓存：SSO允许授权的url 
	 * @return /
	 */
	public static void clearAllowUrls() {
		SaManager.getSaTokenDao().delete(SSO_ALLOW_URL_KEY);
	}

	/**
	 * 获取指定 url 所属的 client 
	 * @return /
	 */
	public static SysClient getClientByUrl(String url) {

    	// 裁剪掉 redirect 的参数部分 
		AjaxError.notIsNull(url, "redirect 不可为空");
    	if(url.indexOf("?") != -1) {
			int index = url.indexOf("?");
			url = url.substring(0, index);
		}

    	// 遍历应用查找 
		List<SysClient> clientList = sysClientMapper.getList(SoMap.getSoMap());
		for (SysClient client : clientList) {
			if(client.getStatus() == 1 && SaFoxUtil.isEmpty(client.getAllowUrl()) == false) {
				String[] urlArray = client.getAllowUrl().split(",");
				Boolean flag = SaStrategy.me.hasElement.apply(Arrays.asList(urlArray), url);
				if(flag) {
					return client;
				}
			}
		}
		return null;
	}

	/**
	 * 获取指定 url 所属的 client id 
	 * @return /
	 */
	public static Long getClientIdByUrl(String url) {
		SysClient client = getClientByUrl(url);
		if(client == null) {
			return null;
		}
		return client.getId();
	}

	/** 
	 * 将一个 SysClient 对象进行进行数据完整性校验 (方便add/update等接口数据校验) [G] 
	 */
	static void check(SysClient s) {
		AjaxError.notIsNull(s.name, "[ 应用名称 ] 不能为空");		// 验证: 应用名称 
		AjaxError.notIsNull(s.logo, "[ 应用图标 ] 不能为空");		// 验证: 应用图标 
		AjaxError.notIsNull(s.intro, "[ 应用介绍 ] 不能为空");		// 验证: 应用介绍 
//		AjaxError.throwByIsNull(s.allowUrl, "[ 允许授权的url ] 不能为空");		// 验证: 允许授权的url (多个用逗号隔开) 
		AjaxError.notIsNull(s.status, "[ 应用状态 ] 不能为空");		// 验证: 应用状态(1=启用, 2=禁用) 
		AjaxError.notIsNull(s.isPublic, "[ 是否公开 ] 不能为空");		// 验证: 是否公开(1=公开, 2=私有)
//		AjaxError.throwByIsNull(s.createTime, "[ 创建时间 ] 不能为空");		// 验证: 创建时间 
	}

	/** 
	 * 获取一个SysClient (方便复制代码用) [G] 
	 */ 
	static SysClient getSysClient() {
		SysClient s = new SysClient();	// 声明对象 
		s.id = 0L;		// id号 
		s.name = "";		// 应用名称 
		s.logo = "";		// 应用图标 
		s.intro = "";		// 应用介绍 
		s.allowUrl = "";		// 允许授权的url (多个用逗号隔开) 
		s.status = 0;		// 应用状态(1=启用, 2=禁用) 
		s.createTime = new Date();		// 创建时间 
		return s;
	}
	
	
	
	
	
}
